package com.carleasoft.mps.data.redis;


import com.carleasoft.mps.data.redis.base.ICacheKey;
import org.springframework.data.redis.core.ReactiveRedisOperations;
import org.springframework.data.redis.core.RedisTemplate;

import java.util.List;

/**
 * redis工具类服务
 * @author: haoyi
 */
public interface JedisService {
    /**
     * 添加缓存 实现步骤:(value作为String保存到缓存)
     * @param cacheKey
     * @param key
     * @param value
     * @return String
     */
    String addString(ICacheKey cacheKey, String key, String value);
    /**
     * @return String add by-key
     */
    String addString(String key, String value);
    /**
     * 添加缓存 实现步骤:(value作为String保存到缓存)
     * @param cacheKey
     * @param key
     * @param value
     * @param seconds 失效时长(秒)
     * @return String
     */
    String addString(ICacheKey cacheKey, String key, String value, Integer seconds);

    /**
     * 添加缓存 实现步骤:(value作为String保存到缓存)
     * @param cacheKey
     * @param key
     * @param value
     * @param seconds 失效时长(秒)
     * @param db
     * @return String
     */
    String addString(ICacheKey cacheKey, String key, String value, Integer seconds,Integer db);
    /**
     * 获取缓存 实现步骤:获取value为string类型
     * @param cacheKey
     * @param key
     * @return String
     */
    String getString(ICacheKey cacheKey, String key);
    /**
     * 获取缓存 by key
     */
    String getString(String key);
    /**
     * 删除缓存 实现步骤:获取value为string类型
     * @param cacheKey
     * @param key
     * @return Long 被删除 key 的数量
     */
    Long deleteString(ICacheKey cacheKey, String key);


    /**
     * 删除缓存 实现步骤:获取value为string类型
     * @param cacheKey
     * @param key
     * @return Long 被删除 key 的数量
     */
    Long deleteString(ICacheKey cacheKey, String key,Integer db);
    /**
     * 方法用途: 添加缓存 实现步骤:(Object会转为byte保存在缓存)
     * @param cacheKey
     * @param key
     * @return String
     */
    String addObject(ICacheKey cacheKey, String key, Object value);
    /**
     * 方法用途: 添加缓存 实现步骤:(Object会转为byte保存在缓存)
     * @param cacheKey
     * @param key
     * @param seconds 失效时长(秒)
     * @return String
     */
    String addObject(ICacheKey cacheKey, String key, Object value, Integer seconds);
    /**
     * 获取缓存 实现步骤:获取value为Object类型
     * @param cacheKey
     * @param key
     * @return Object
     */
    Object getObject(ICacheKey cacheKey, String key);
    /**
     * 删除缓存 实现步骤:获取value为Object类型
     * @param cacheKey
     * @param key
     * @return Long 被删除 key 的数量
     */
    Long deleteObject(ICacheKey cacheKey, String key);
    /**
     * 缓存中是否存在这个Key
     * @param cacheKey
     * @param key
     * @return Boolean
     */
    Boolean exists(ICacheKey cacheKey, String key);
    /**
     * 根据缓存类型获取类型下所以的key值集合
     * @param cacheKey
     * @return List
     */
    List<String> keys(ICacheKey cacheKey);
    /**
     * 分布式锁,使用做交易锁竞争较好，无死锁风险，过期时间秒
     * @param cacheKey
     * @param key
     * @return Boolean
     */
    boolean dcsLock(ICacheKey cacheKey, String key, String value, long expireSeconds);
    /**
     * 释放分布式锁,传入value，体现原汤化原食，解铃还须系铃人思维
     * @param cacheKey
     * @param key
     * @return Boolean
     */
    boolean releaseDcsLock(ICacheKey cacheKey, String key, String value);

    List<String> hmget(String key, List<String> ids);

    /**
     * 存
     * @param key
     * @param ids
     * @return
     */
    void hmset(String key, List<Object> objects, List<String> ids);

    /**
     * 存
     * @param key
     * @param
     * @return
     */
    void hmset(String key, Object object, String id);



    /**
     * 更新缓存 实现步骤:(value缓存以及让值增加 1 )
     * @param key
     * @return String
     */
    String incrString(String key);

    /**
     * 更新缓存 实现步骤:(value缓存以及让值增加 1 )
     * @param key
     * @return String
     */
    Long incrBy(String key,long by);

    /**
     * 更新缓存 实现步骤:(value缓存以及让值增加 1 )
     * @param key
     * @return String
     */
    String incrString(ICacheKey cacheKey,String key);

    /**
     * 添加缓存 实现步骤:(value缓存设置为 0  )
     * @param key
     * @return String
     */
    String setCounterString(String key, Integer second);

    /**
     * 限流
     * @param key
     * @return String
     */
    Boolean limiter(ICacheKey cacheKey,String key);

    RedisTemplate<String, Object> getTemp();
}
